/**
 * Created with CLion.
 * Description: 非Qt环境使用
 * User: loong
 * Date: 2020-01-01
 * Time: 9:55
 */
#ifndef PLANTROBOT_MYFIRSTPCM_H
#define PLANTROBOT_MYFIRSTPCM_H

#include <cstdio>
#include <alsa/asoundlib.h>
#include "src/utils/myTimeHelper.h"

/**
 * wav音频头部格式
 */
/********以下是wave格式文件的文件头格式说明******/
/*------------------------------------------------
|             RIFF WAVE Chunk                  |
|             ID = 'RIFF'                      |
|             RiffType = 'WAVE'                |
------------------------------------------------
|             Format Chunk                     |
|             ID = 'fmt '                      |
------------------------------------------------
|             Fact Chunk(optional)             |
|             ID = 'fact'                      |
------------------------------------------------
|             Data Chunk                       |
|             ID = 'data'                      |
------------------------------------------------*/
/**********以上是wave文件格式头格式说明***********/
//每个Chunk的size字段，都是表示除了本Chunk的ID和SIZE字段外的长度;
/*wave 文件一共有四个Chunk组成，其中第三个Chunk可以省略，每个Chunk有标示（ID）,大小（size,就是本Chunk的内容部分长度）,内容三部分组成*/
typedef struct _wave_pcm_hdr {
    char riff[4];                           // = "RIFF"
    int size_8;                             // = FileSize - 8
    char wave[4];                           // = "WAVE"

    char fmt[4];                            // = "fmt "
    int fmt_size;                           // = 下一个结构体的大小 : 16。16后没有附加消息，18后有附加消息；一般为16，其他格式转来的话为18
    short int format_tag;                   // = PCM : 1。编码方式，一般为0x0001;
    short int channels;                     // = 通道数 : 1。声道数目，1单声道，2双声道;
    int samples_per_sec;                    // = 采样率 : 8000 | 6000 | 11025 | 16000。采样频率;
    int avg_bytes_per_sec;                  // = 每秒字节数 : samples_per_sec * bits_per_sample / 8。每秒所需字节数;
    short int block_align;                  // = 每采样点字节数 : wBitsPerSample / 8。每个采样需要多少字节，若声道是双，则两个一起考虑;
    short int bits_per_sample;              // = 量化比特数: 8 | 16。即量化位数

    char data[4];                           // = "data";
    int data_size;                          // = 纯数据长度 : FileSize - 44
} wave_pcm_hdr;


/**
* 功能：播放音频
* @param default_wav_hdr 声音格式
* @param fileName 文件名
* @return 错误返回-1。正确返回0.
*/
extern int playBack(wave_pcm_hdr default_wav_hdr, const char *fileName);

/**
 * 功能：捕捉声音
 * @param default_wav_hdr 声音格式
 * @param fileName 文件名
 * @return 错误返回-1。正确返回0.
 */
extern int capture(wave_pcm_hdr default_wav_hdr, const char *fileName);

#endif //PLANTROBOT_MYFIRSTPCM_H
